package com.zzu.utils;

import android.content.Context;
import android.os.Build;
import android.util.Log;

import androidx.annotation.RequiresApi;

import com.google.gson.Gson;
import com.zzu.model.bean.JsonBean;
import com.zzu.model.bean.User;

import org.json.JSONArray;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @description:
 * @author: bytedance
 * @date: 2021-05-15 17:05
 * 存储在内存中的数据
 */
public class AppStorage {

    private static Context sContext;
    private static Map<String,String> code_region,region_code;
    private static User mUser = new User();

    public static ArrayList<JsonBean> options1Items = new ArrayList<>(); //省
    public static  ArrayList<ArrayList<String>> options2Items = new ArrayList<>();//市
    public static  ArrayList<ArrayList<ArrayList<String>>> options3Items = new ArrayList<>();//区

    public static String twn = "中原区";

    //初始化加载地址数据
    public static void initRegion(Context context){
        sContext = context;
        readFile();
        if(code_region.size() > 0){
            Log.i("","始化加载地址数据:"+code_region+"\n\n"+region_code);
        }
    }

    //从内存获取用户的信息
    public static void saveUserInfo(User user){
        mUser = user;
    }


    public static User getUser() {
        if(mUser == null){
            mUser = new User();
        }
        return mUser;
    }


    /**
     * 通过地区名获得地区编号
     * @param regionName
     * @return
     */
    public static String getRegionCode(String regionName){
        return region_code.get(regionName);
    }

    /**
     * 通过地区编号获得地区名
     * @param regionCode
     * @return
     */
    public static String getRegionName(String regionCode){
        return code_region.get(regionCode);
    }


    /**
     * 通过地区名获取省市区的名字
     * @return  大小为3的集合，分别表示省市区
     */

    public static List<String> getRegionThreeName(String address){
        /*
         * java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类：Pattern和Matcher Pattern
         *    一个Pattern是一个正则表达式经编译后的表现模式。 Matcher
         *    一个Matcher对象是一个状态机器，它依据Pattern对象做为匹配模式对字符串展开匹配检查。
         *    首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式，然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行		   *	字符串的匹配工作。
         */
        String regex="(?<province>[^省]+自治区|.*?省|.*?行政区|.*?市)?(?<city>[^市]+自治州|.*?地区|.*?行政单位|.+盟|市辖区|.*?市|.*?县)?(?<county>[^县]+县|.+区|.+市|.+旗|.+海域|.+岛)";
        Matcher m= Pattern.compile(regex).matcher(address);
        List<String> ans = new ArrayList<>();
        while(m.find()){
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                ans.add(m.group("province"));
                ans.add(m.group("city"));
                ans.add(m.group("county"));
            }
        }
        return ans;
    }

    /**
     * 加载省市区三级联动的数据
     * @param context
     */
    public static void initJsonData(Context context) {//解析数据 （省市区三级联动）
        /**
         * 注意：assets 目录下的Json文件仅供参考，实际使用可自行替换文件
         * 关键逻辑在于循环体
         *
         * */
        String JsonData = new GetJsonDataUtil().getJson(context, "province.json");//获取assets目录下的json文件数据

        ArrayList<JsonBean> jsonBean = parseData(JsonData);//用Gson 转成实体

        /**
         * 添加省份数据
         *
         * 注意：如果是添加的JavaBean实体，则实体类需要实现 IPickerViewData 接口，
         * PickerView会通过getPickerViewText方法获取字符串显示出来。
         */
        options1Items = jsonBean;

        for (int i = 0; i < jsonBean.size(); i++) {//遍历省份
            ArrayList<String> CityList = new ArrayList<>();//该省的城市列表（第二级）
            ArrayList<ArrayList<String>> Province_AreaList = new ArrayList<>();//该省的所有地区列表（第三级）

            for (int c = 0; c < jsonBean.get(i).getCityList().size(); c++) {//遍历该省份的所有城市
                String CityName = jsonBean.get(i).getCityList().get(c).getName();
                CityList.add(CityName);//添加城市
                ArrayList<String> City_AreaList = new ArrayList<>();//该城市的所有地区列表

                //如果无地区数据，建议添加空字符串，防止数据为null 导致三个选项长度不匹配造成崩溃
                if (jsonBean.get(i).getCityList().get(c).getArea() == null
                        || jsonBean.get(i).getCityList().get(c).getArea().size() == 0) {
                    City_AreaList.add("");
                } else {
                    City_AreaList.addAll(jsonBean.get(i).getCityList().get(c).getArea());
                }
                Province_AreaList.add(City_AreaList);//添加该省所有地区数据
            }

            /**
             * 添加城市数据
             */
            options2Items.add(CityList);

            /**
             * 添加地区数据
             */
            options3Items.add(Province_AreaList);
        }
    }

    public static  ArrayList<JsonBean> parseData(String result) {//Gson 解析
        ArrayList<
    JsonBean> detail = new ArrayList<>();
        try {
            JSONArray data = new JSONArray(result);
            Gson gson = new Gson();
            for (int i = 0; i < data.length(); i++) {
                JsonBean entity = gson.fromJson(data.optJSONObject(i).toString(), JsonBean.class);
                detail.add(entity);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return detail;
    }

    private static void readFile(){
        region_code = new HashMap<>();
        code_region = new HashMap<>();
        BufferedReader br = null;
        try{
            InputStreamReader inputReader = new InputStreamReader(sContext.getAssets().open("find.txt") );
            br = new BufferedReader(inputReader);
            String line = br.readLine();
            while(line != null){
                String[] tmp = line.split(" ");
                region_code.put(tmp[0], tmp[1]);
                code_region.put(tmp[1], tmp[0]);
                line = br.readLine();
            }
        }catch (IOException ioe){
            ioe.printStackTrace();
        }
    }

}
